﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ArduinoGenericDistanceSensor.Sensors.IRSensors
{
    /// <summary>
    /// Класс для работы с ИК датчиком расстояния Sharp GP2Y0A21YK0F.
    /// </summary>
    public class Sharp_GP2Y0A21YK0F: ISensorBase
    {
        /// <summary>
        /// Спецификация устройства Sharp GP2Y0A21YK0F.
        /// </summary>
        public sealed class Specification
        {
            /// <summary>
            /// Минимальная дистанция обнаружения препятствий (в мм).
            /// </summary>
            public static int MinDistance = 100;

            /// <summary>
            /// Максимальная дистанция обнаружения препятствий (в мм).
            /// </summary>
            public static int MaxDistance = 400;

            /// <summary>
            /// Калибровочные данные для сенсора.
            /// </summary>
            public static Dictionary<int, int> CalibrationData = new Dictionary<int, int>();
        }

        /// <summary>
        /// Последняя полученная дистанция до препятствия.
        /// </summary>
        private double mDistance = 0;

        public Sharp_GP2Y0A21YK0F()
        {
            if (Specification.CalibrationData.Count == 0)
            {
                /*
                 * Заполнение калибровочных данных датчика.
                 * */
                //Specification.CalibrationData.Add(130, 100);
                //Specification.CalibrationData.Add(150, 120);
                //Specification.CalibrationData.Add(160, 140);
                //Specification.CalibrationData.Add(175, 160);
                //Specification.CalibrationData.Add(180, 180);
                //Specification.CalibrationData.Add(185, 200);
                //Specification.CalibrationData.Add(190, 220);
                //Specification.CalibrationData.Add(200, 250);
                //Specification.CalibrationData.Add(205, 300);
                //Specification.CalibrationData.Add(211, 350);
                //Specification.CalibrationData.Add(213, 400);

                Specification.CalibrationData.Add(450, 100);
                Specification.CalibrationData.Add(420, 110);
                Specification.CalibrationData.Add(405, 120);
                Specification.CalibrationData.Add(372, 130);
                Specification.CalibrationData.Add(350, 140);
                Specification.CalibrationData.Add(330, 150);
                Specification.CalibrationData.Add(300, 170);
                Specification.CalibrationData.Add(255, 200);
                Specification.CalibrationData.Add(205, 250);
                Specification.CalibrationData.Add(180, 300);
            }
        }

        public double GetDistanceMax()
        {
            return Specification.MaxDistance;
        }

        public double GetDistanceMin()
        {
            return Specification.MinDistance;
        }

        public double GetDistanceCurrent()
        {
            return mDistance;
        }

        public void SetAnalogData(int value)
        {
            if (value >= Specification.CalibrationData.First().Key) mDistance = Specification.CalibrationData.First().Value;
            else if (value <= Specification.CalibrationData.Last().Key) mDistance = Specification.CalibrationData.Last().Value;
            else
            {
                for (int i = 0; i < Specification.CalibrationData.Count - 1; i++)
                {
                    var element = Specification.CalibrationData.ElementAt(i);
                    var element2 = Specification.CalibrationData.ElementAt(i + 1);
                    if (value <= element.Key && (i == (Specification.CalibrationData.Count - 1) ||
                        value > element2.Key))
                    {
                        mDistance = element.Value;
                        return;
                    }
                }
                mDistance = 0;
            }
        }

        public string GetName()
        {
            return "Sharp GP2Y0A21YK0F";
        }
    }
}
